package city.spring.modules.work.entity;

import city.spring.configure.mybatis.FillCurrentUser;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import org.apache.commons.lang.StringUtils;

import java.io.Serializable;
import java.time.LocalDate;
import java.util.Date;

/**
 * 实体类：值班替班申请表。
 * <p>
 * 三种应用场景：
 * <ol>
 *     <li>一、休假：{@link #sourceId} 存在，{@link #targetWorkScheduleId} / {@link #targetWorkScheduleDate} / {@link #targetWorkScheduleShiftId} / {@link #targetWorkScheduleItemId} 不存在</li>
 *     <li>二、替班：{@link #sourceId }/ {@link #targetWorkScheduleItemId} 存在，{@link #targetWorkScheduleId} / {@link #targetWorkScheduleDate} / {@link #targetWorkScheduleShiftId} 不存在</li>
 *     <li>三、新增上班：{@link #sourceId} / {@link #targetWorkScheduleItemId} 不存在，{@link #targetWorkScheduleId} / {@link #targetWorkScheduleDate} / {@link #targetWorkScheduleShiftId} 存在</li>
 * </ol>
 * </p>
 *
 * @author 侯坤林
 * @date 2020-06-28 10:24:34
 */
@Data
@TableName("work_replace_apply")
public class WorkReplaceApplyEntity implements Serializable {

    /**
     * 主键ID
     */
    @TableId(type = IdType.ASSIGN_ID)
    private String id;

    /**
     * 申请用户
     */
    private String userId;

    /**
     * 排班方案所属组织机构
     */
    @FillCurrentUser(FillCurrentUser.Type.OrgId)
    @TableField(fill = FieldFill.INSERT, updateStrategy = FieldStrategy.NEVER)
    private String orgId;

    /**
     * 原班ID（当前上班的ID）
     */
    private String sourceId;

    /**
     * 目标排班表
     */
    private String targetWorkScheduleId;

    /**
     * 目标排班表的上班日期
     */
    private LocalDate targetWorkScheduleDate;

    /**
     * 目标排班表的上班班次
     */
    private String targetWorkScheduleShiftId;

    /**
     * 目标替换班ID（预替换的值班记录ID）
     */
    private String targetWorkScheduleItemId;

    /**
     * 审核结果（0待审核，1通过，2不通过）
     */
    private Integer result;

    /**
     * 审核意见（评论）
     */
    private String review;

    /**
     * 更新次数（乐观锁）
     */
    @Version
    private Integer version;

    /**
     * 创建时间
     */
    @TableField(insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
    private Date gmtCreated;

    /**
     * 更新时间
     */
    @TableField(insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
    private Date gmtModified;

    /**
     * 判断是否休息
     *
     * @return
     */
    public boolean isRest() {
        return StringUtils.isNotBlank(sourceId) && !isAdd() && !isReplace();
    }

    public void setRest() {
        setAdd();
        setReplace();
    }

    /**
     * 是否是替班
     *
     * @return 替班
     */
    public boolean isReplace() {
        // 替班需要有被替换的ID，并且其他的值为null
        // return StringUtils.isNotBlank(targetWorkScheduleItemId) && (
        //         StringUtils.isBlank(targetWorkScheduleId) ||
        //                 StringUtils.isBlank(targetWorkScheduleShiftId) ||
        //                 targetWorkScheduleDate == null);
        return StringUtils.isNotBlank(sourceId) && StringUtils.isNotBlank(targetWorkScheduleItemId);
    }

    /**
     * 是否是增加上班
     *
     * @return 增加上班
     */
    public boolean isAdd() {
        // 增加上班，被替换的ID必须为null
        // return StringUtils.isBlank(targetWorkScheduleItemId) &&
        //         StringUtils.isNotBlank(targetWorkScheduleId) &&
        //         StringUtils.isNotBlank(targetWorkScheduleShiftId) &&
        //         targetWorkScheduleDate != null;
        return StringUtils.isNotBlank(targetWorkScheduleId) &&
                StringUtils.isNotBlank(targetWorkScheduleShiftId) &&
                targetWorkScheduleDate != null;
    }

    /**
     * 设置替班状态
     */
    public void setReplace() {
        targetWorkScheduleId = null;
        targetWorkScheduleShiftId = null;
        targetWorkScheduleDate = null;
    }

    /**
     * 设置新增上班状态
     */
    public void setAdd() {
        targetWorkScheduleItemId = null;
    }
}